
/*
  注：
    1，文件中所有同步操作，需要确定要操作的文件存在，如不存在则会报错
    2，所有操作的路径需 wx.env.USER_DATA_PATH 处理
*/



var fs = wx.getFileSystemManager();
var wx_path = wx.env.USER_DATA_PATH;


//===== ##### 文件操作



/*
  ### 向文件写入内容
  参一：string 要写入的路径
  参二：string 要写入的内容
  参三：maix   有值为同步方式，空为异步方式
  参四：string   编码，默认空为utf8
  参五：function 回调 成功返回ok,失败返回err
  示例：
    f.Writes(status_path,'123',1,'',function(res){
      tools.C(res);
    });
*/
function _writes(path, data, fun) {
  var parentDir = path.substring(0, path.lastIndexOf('/'));
  _has(parentDir, function (s) {
    if (s == 'ok') {  //父目录存在
      _writes2(path, data, fun);
    } else {          //父目录不存在则创建
      _mkDir(parentDir, function (s2) {
        if (/.*ok$/.test(s2)) {
          _writes2(path, data, fun);
        } else {
          if (fun) fun('create parent dir is err');
        }
      })
    }
  })

  function _writes2(path, data, fun) {
    fs.writeFile({
      filePath: wx_path + path,
      data: data,
      success(res) {
        if (/.*ok$/.test(res.errMsg)) {
          if (fun) fun('write the file "' + path + '" is ok');
        } else {
          if (fun) fun('write the file "' + path + '" is err');
        }
      },
      fail(e) {
        if (fun) fun(e.errMsg);
      }
    });
  }
}
module.exports._writes = _writes




/*
  ### 删除文件
  参一：string   文件路径 如： /a/b.txt
  参二：function 回调
  示例：
    f._delFile('/b/b/e1/c1',function(res){
      app.C(res);
    });

*/
function _delFile(path,fun) {
  _has(path, function (s) {
    if (s == 'ok') {
      fs.unlink({
        filePath: wx_path + path,
        success(res) {
          if (/ok$/.test(res.errMsg)) {
            if (fun) fun('delelte the file "' + path + '"is ok');
          } else {
            if (fun) fun('delelte the file "' + path + '"is err');
          }
        },
        fail(e) {
          if (fun) {
            if(fun) fun(e.errMsg);
          }
        }
      });
    } else {
      if (fun) fun('the file "' + path + '"is not exists');
    }
  });
}
module.exports._delFile = _delFile








/*
  ### 读取文件内容
  参一：string   文件路径
  参二：function 回调，返回读取的内容
  参三：string   编码，默认空为utf8
  示例：
    f._reads('/currentCity2', function (res) {
      app.C(res);
    });
*/
function _reads(path, fun, coding) {
  if (!coding) {
    coding = 'utf8';
  }
  _has(path, function (s) {
    if (s == 'ok') {
      fs.readFile({
        filePath: wx_path + path,
        encoding: coding,
        success(res) {
          if(fun)fun(res.data);
        },
        fail(e) {
          if(fun)fun(e.errMsg);
        }
      });
    } else {
      if(fun)fun('the file "'+path+'" is not exists');
    }
  });

}
module.exports._reads = _reads












//===== ##### 目录操作


/*
  ### 创建目录 (可跨层创建)
  参一：string  创建的目录路径 
  参二：回调   返回 ok , err ,exists
  参三：bool  是否同步操作,默认空为异步，有值为同步
  示例：
    f._mkDir('/a5/b/c/d',function(res){
      app.C(res);
    });
*/
function _mkDir(path, fun) {
  _has(path, function (s) {
    if (s == 'ok') {
      if (fun) fun('the dir "' + path + '" is exists');
    } else {
      fs.mkdir({
        dirPath: wx_path + path,
        recursive: true,
        success(res) {
          if (/ok$/.test(res.errMsg)) {
            if (fun)fun('the dir "' + path + '" create is ok');
          } else {
            if (fun)fun('the dir "' + path + '" create is err');
          }
        },
        fail(e) {
          if (fun)fun(e.errMsg);
        }
      })
    }
  });
}
module.exports._mkDir = _mkDir








/*
  ### 删除指定目录(递归可附删文件)
  参一：stirng     路径 
  参二：fun        回调   ok 或 失败信息
  参三：boot       是否递归删除目录中内容，默认false,非递归
  示例：
    f._delDir('/a5/b/c', function (res) {
      app.C(res);
    });
*/
function _delDir(path, fun, recursive) {
  var recursive = recursive ? true : false;
  _has(path, function (s) {
    if (s == 'ok') {
      fs.rmdir({
        dirPath: wx_path + path,
        recursive: recursive,
        success(res) {
          C(res);
          if (fun) fun('delete the dir ' + path + ' is ok');
        },
        fail(e) {
          if (fun) fun(e.errMsg);
        }
      });
    } else {
      if (fun) fun('the dir ' + path + ' is not exists！');
    }
  });
}
module.exports._delDir = _delDir




/*
  ### 获取指定目录下的内容列表
  参一：string  路径
  参二：fun     回调，返回目录内容的数组列表
  示例：
    f._getDirInfo('/',function(res){
      app.C(res);
    })
*/
function _getDirInfo(path, fun) {
  if (!/^\/.*/.test(path)) {
    fun('路径非法！如：/a')
    return
  }
  _has(path, function (resHas) {
    var path2 = wx_path + path;
    if (resHas == 'ok') {
      fs.readdir({
        dirPath: path2,
        success(resRead) {
          if(fun)fun(resRead.files);
        },
        fail(e) {
          if (fun)fun(e.errMsg);
        }
      });
    } else {
      if (fun)fun('dir ' + path + ' is not exists');
    }
  });
}
module.exports._getDirInfo = _getDirInfo











//===== 公共


function C(r) {
  console.log(r);
}



/*
  ### 判断文件或目录是否存在
  参一：路径
  参二：回调 存在返回ok,不存在返回err
  示例：
    f._has('/a1/b',function(res){
      app.C(res);
    });

*/
function _has(path, fun) {
  var path2 = wx_path + path;
  fs.access({
    path: path2,
    success(res) {
      if (/ok$/.test(res.errMsg)) {
        if (fun) fun('ok');
      } else {
        if (fun) fun('err');
      }
    },
    fail(e) {
      if (fun) fun('err');
    }
  })
}
module.exports._has = _has
















/*
  ### 判断是目录还是文件 及获取状态
  参一：string  路径
  参二：function 回调  文件返回 'file' , 目录返回 'dir'  ,失败返回异常信息
  参三：int  默认无值为判断是文件或目录，有值则为获取文件或目录状态
  示例：
    f._stats('/', function (res) {
      app.C(res);
    },1);
*/
function _stats(path, fun, type) {
  _has(path, function (s) {
    if (s == 'ok') {
      fs.stat({
        path: wx_path + path,
        success(res) {
          if (!type) {
            if (res.stats.isDirectory()) {
              fun('dir');
            }
            if (res.stats.isFile()) {
              fun('file');
            }
          } else {
            fun(res.stats);
          }
        },
        fail(e) {
          fun(e.errMsg);
        }
      });
    } else {
      fun(s);
    }
  });

}
module.exports._stats = _stats














































